package com.ruoyi.common.xss;

import com.ruoyi.common.utils.StringUtils;

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 自定义xss校验注解实现
 *
 * @author ruoyi
 */
public class XssValidator implements ConstraintValidator<Xss, String> {

    private final static String HTML_PATTERN = "<(\\S+?)[^>]*>[^<]*|<\\s*/\\s*(\\S+?)\\s*>";

    /**
     * 判断给定的字符串中是否包含HTML标签
     *
     * @param value 字符串
     * @return 是否包含Html标签
     */
    public static boolean containsHtml(String value) {
        // 编译正则表达式，以提高性能（对于频繁调用的方法）。
        Pattern pattern = Pattern.compile(HTML_PATTERN);
        Matcher matcher = pattern.matcher(value);
        // 直接使用Matcher.matches()检查整个字符串是否只由HTML标签组成。
        // 这样简化了逻辑，并且避免了不必要的字符串操作。
        return matcher.matches();
    }

    @Override
    public boolean isValid(String value, ConstraintValidatorContext constraintValidatorContext) {
        if (StringUtils.isBlank(value)) {
            return true;
        }
        return !containsHtml(value);
    }
}
